const Router = require('@koa/router');
const jsonwebtoken = require('jsonwebtoken')
const bcrypt = require('bcrypt')

const User = require('../model/sql/userModel')

const router = new Router({
  prefix: '/api/test'
});
const saltRounds = 10 // 加盐

router.post('/public/register', async (ctx, next) => {
  const body = ctx.request.body
  let { account, password } = body // 获取账户信息、密码
  // 判断账号是否已注册
  const user = await User.findOne({
    where: {
      account: account
    }
  })
  // 如果已注册，返回错误信息
  if (user) {
    ctx.body = {
      message: '账户已经存在'
    }
    return
  }
  // 如果未注册，进行密码加密
  await bcrypt.hash(password, saltRounds).then((hash) => {
    password = hash
  })
  // 创建用户
  await User.create({
    username: account,
    password: password,
    account: account,
    permissions: [],
    ctime: Date.now()
  })
  // 返回成功信息
  ctx.body = {
    message: '注册成功'
  }
})

// 用户登录鉴权接口，根据 account 和 password 获取 token 返回给客户端
router.post('/public/login', async (ctx, next) => {
  const body = ctx.request.body
  let { account, password } = body
  // 判断参数是否为空
  if (!account || !password) {
    ctx.body = {
      message: '参数错误'
    }
    return
  }
  // 判断账户是否存在
  let user = await User.findOne({
    where: {
      account: account
    }
  })
  // 如果账户不存在，返回错误信息
  if (!user) {
    ctx.body = {
      message: '账户不存在'
    }
    return
  }
  // 判断密码是否正确
  let isequal
  await bcrypt.compare(password, user.password).then(function(res) {
    isequal = res === true
  })
  // 如果密码错误，返回错误信息
  if (!isequal) {
    ctx.body = {
      message: '密码错误'
    }
    return
  }
  // 如果密码正确，生成 token
  const token = jsonwebtoken.sign({
    account: user.account,
    id: user.id
  }, 'ChenNick', { expiresIn: '3h' }) // 签名拿到 token 有效期为3小时
  // 将 token 种到网站网址的 cookie 里
  ctx.cookies.set(
    'token',
    token,
    {
      domain: 'localhost', // 设置 cookie 的域
      path: '/', // 设置 cookie 的路径
      maxAge: 3 * 60 * 60 * 1000, // cookie 的有效时间 ms
      // expires: new Date('2021-12-30'), // cookie 的失效日期，如果设置了 maxAge，expires 将没有作用
      httpOnly: true, // 是否要设置 httpOnly
      overwrite: true // 是否要覆盖已有的 cookie 设置
    }
  )
  ctx.body = {
    message: '登录成功'
  }
})

// 获取用户信息接口
router.get('/userinfo', async (ctx, next) => {
  const id = ctx.query.id
  let data = await User.findOne({
    where: {
      id: id
    }
  })
  let res = {
    account: data.account,
    id: data.id,
    permissions: data.permissions,
    role_id: data.role_id,
    role_name: data.role_name,
    username: data.username
  }
  ctx.body = {
    data: res,
    message: '获取用户信息成功'
  }
})

// 退出登录
router.post('/logout', async (ctx) => {
  const id = ctx.state.userinfo.id

  let user = await User.findOne({
    where: {
      id: id
    }
  })
  const token = jsonwebtoken.sign({
    username: user.username,
    account: user.account,
    id: user.id
  }, 'ChenNick', {
    expiresIn: 0, // 马上过期
  })
  ctx.cookies.set(
    'token',
    token,
    {
      domain: 'localhost', // 设置 cookie 的域
      path: '/', // 设置 cookie 的路径
      maxAge: 0, // cookie 的有效时间 ms
      // expires: new Date('2021-12-30'), // cookie 的失效日期，如果设置了 maxAge，expires 将没有作用
      httpOnly: true, // 是否要设置 httpOnly
      overwrite: true // 是否要覆盖已有的 cookie 设置
    }
  )
  ctx.body = {
    message: '退出登录成功'
  }
})

module.exports = router; 